﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataType
{
    internal class DataTypeProgram
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0,-10} {1,5} {2,30} {3,30}", "Type", "Bytes", "Min", "Max");// {0,-10} 表示第一个参数左对齐，占10个字符宽度
                                                                                            // {1,5} 表示第二个参数右对齐，占5字符宽度


            PrintTypeInfo<sbyte>("sbyte");
            PrintTypeInfo<byte>("byte");
            PrintTypeInfo<short>("short");
            PrintTypeInfo<ushort>("ushort");
            PrintTypeInfo<int>("int");
            PrintTypeInfo<uint>("uint");
            PrintTypeInfo<long>("long");
            PrintTypeInfo<ulong>("ulong");
            PrintTypeInfo<float>("float");
            PrintTypeInfo<double>("double");
            PrintTypeInfo<decimal>("decimal");
            Console.ReadLine();
        }

        static void PrintTypeInfo<T>(string typeName) where T : struct // 泛型参数<T>表示可以接受任何值类型
                                                                       // where T : struct 确保T必须是值类型，排除引用类型（如类）
        {
            int bytes = System.Runtime.InteropServices.Marshal.SizeOf(typeof(T)); //sizeof只能用于编译时已知的非托管类型，而Marshal.SizeOf支持托管类型decimal
            dynamic minValue = typeof(T).GetField("MinValue").GetValue(null);
            dynamic maxValue = typeof(T).GetField("MaxValue").GetValue(null);

            Console.WriteLine("{0,-10} {1,5} {2,30} {3,30}",typeName,bytes,minValue.ToString(),maxValue.ToString());
        }
    }
}


//static void Main()
//{
//    Console.WriteLine("{0,-10} {1,5} {2,30} {3,30}", "Type", "Bytes", "Min", "Max");

//    PrintInfo("sbyte", sizeof(sbyte), sbyte.MinValue, sbyte.MaxValue);
//    PrintInfo("byte", sizeof(byte), byte.MinValue, byte.MaxValue);
//    PrintInfo("short", sizeof(short), short.MinValue, short.MaxValue);
//    PrintInfo("ushort", sizeof(ushort), ushort.MinValue, ushort.MaxValue);
//    PrintInfo("int", sizeof(int), int.MinValue, int.MaxValue);
//    PrintInfo("uint", sizeof(uint), uint.MinValue, uint.MaxValue);
//    PrintInfo("long", sizeof(long), long.MinValue, long.MaxValue);
//    PrintInfo("ulong", sizeof(ulong), ulong.MinValue, ulong.MaxValue);
//    PrintInfo("float", sizeof(float), float.MinValue, float.MaxValue);
//    PrintInfo("double", sizeof(double), double.MinValue, double.MaxValue);
//    PrintInfo("decimal", 16, decimal.MinValue, decimal.MaxValue); // ！！！sizeof 不支持 decimal
//}

//static void PrintInfo(string typeName, int bytes, object min, object max)
//{
//    Console.WriteLine("{0,-10} {1,5} {2,30} {3,30}",
//        typeName,
//        bytes,
//        min.ToString(),
//        max.ToString());